import { Inject, Injectable } from '@nestjs/common';
import * as tencentcloud from 'tencentcloud-sdk-nodejs';
import { Client } from 'tencentcloud-sdk-nodejs/tencentcloud/services/sms/v20190711/sms_client';
import { TX_SMS_MODULE_OPTIONS } from './sms.constants';
import { TXSmsOptions } from './sms.interface';

// 导入对应产品模块的client models。
const CvmClient = tencentcloud.sms.v20190711.Client;

@Injectable()
export class SmsService {
  private client: Client;
  constructor(
    @Inject(TX_SMS_MODULE_OPTIONS) private readonly txSmsOptions: TXSmsOptions,
  ) {
    this.client = new CvmClient({
      // 腾讯云认证信息
      // 为了保护密钥安全，建议将密钥设置在环境变量中或者配置文件中，请参考本文凭证管理章节。
      // 硬编码密钥到代码中有可能随代码泄露而暴露，有安全隐患，并不推荐。
      credential: {
        secretId: this.txSmsOptions.secretId,
        secretKey: this.txSmsOptions.secretKey,
      },
      // 产品地域
      region: this.txSmsOptions.region,
      // 可选配置实例
      profile: {
        signMethod: 'HmacSHA256', // 签名方法
        httpProfile: {
          reqMethod: 'POST', // 请求方法
          reqTimeout: 30, // 请求超时时间，默认60s
        },
      },
    });
  }

  /**
   * 发送手机验证码
   * @param data 请求体
   */
  async registerCode(data: {
    phone: number;
    TemplateID: string;
    params: Array<any>;
  }): Promise<any> {
    const { phone, TemplateID, params } = data;
    if (!phone) {
      return {
        code: 400,
        msg: '手机号为空',
      };
    }
    const smsParams = {
      /* 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
       * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号*/
      PhoneNumberSet: [`+86${phone}`],
      /* 短信应用ID: 短信SdkAppid在 [短信控制台] 添加应用后生成的实际SdkAppid，示例如1400006666 */
      SmsSdkAppid: this.txSmsOptions.SmsSdkAppid,
      /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
      TemplateID: TemplateID || '1761555',
      /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 [短信控制台] 查看 */
      Sign: this.txSmsOptions.Sign,
      /* 模板参数: 若无模板参数，则设置为空*/
      TemplateParamSet: [...params],
    };

    try {
      const result = (await this.client.SendSms(smsParams)) as any;
      if (result.SendStatusSet[0].Code === 'Ok') {
        return {
          code: 200,
          msg: 'Success',
        };
      } else {
        return {
          code: 500,
          msg: `Service error: ${result?.SendStatusSet.Message}`,
        };
      }
    } catch (err) {
      return {
        code: 500,
        msg: `Service error: ${err}`,
      };
    }
  }
}
